package com.mycompany.rest;

import java.security.Timestamp;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.mycompany.optimizaproject.Incidente;
import com.mycompany.services.dao.IncidenteDAO;

@Controller
@RequestMapping("/incidente")
public class IndicenteRestController extends AbstractRestController<Incidente, Integer> {

	@Autowired
	private IncidenteDAO incidentesDao;

	public void init() {
		setDao(incidentesDao);
	}

	@RequestMapping(value = "", method = RequestMethod.GET)
	public ModelAndView getIncidentesByUser(@RequestParam(USER_ID) int userId) {
		try {
			List<Incidente> incidentes = this.incidentesDao.getIncidentsByUser(userId);
			log.debug("Returing incidentes: " + incidentes.toString());
			return new ModelAndView(jsonView_i, "data", incidentes);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar obtener la lista", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}
	
	@RequestMapping(value = "/por-cliente", method = RequestMethod.GET)
	public ModelAndView getIncidentesByClient(@RequestParam(USER_ID) int userId) {
		try {
			List<Incidente> incidentes = this.incidentesDao.getIncidentsByClient(userId);
			log.debug("Returing incidentes: " + incidentes.toString());
			return new ModelAndView(jsonView_i, "data", incidentes);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar obtener la lista", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}
	
	@RequestMapping(value = "/entre-fechas", method = RequestMethod.GET)
	public ModelAndView getIncidentesBetweenDates(@RequestParam("fechaInicio") int fechaInicio, @RequestParam("fechaFin") int fechaFin) {
		try {
			List<Incidente> incidentes = this.incidentesDao.getIncidentsBetweenDates(fechaInicio, fechaFin);
			log.debug("Returing incidentes: " + incidentes.toString());
			return new ModelAndView(jsonView_i, "data", incidentes);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar obtener la lista", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}
	
	
	
	@RequestMapping(value = "/por-usuario-admin", method = RequestMethod.GET)
	public ModelAndView getIncidentesByUserAdmin(@RequestParam(USER_ID) int userId) {
		try {
			List<Incidente> incidentes = this.incidentesDao.getIncidentsByUserAdmin(userId);
			log.debug("Returing incidentes: " + incidentes.toString());
			return new ModelAndView(jsonView_i, "data", incidentes);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar obtener la lista", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}
	
	@RequestMapping(value = "/solucion", method = RequestMethod.GET)
	public ModelAndView addSolution(@RequestParam("idIncidente") int idIncidente, @RequestParam("solucion") String solucion) {
		try {
			int returned = this.incidentesDao.updateTicketSolution(idIncidente, solucion);
			log.debug("Returing incidentes: " + returned);
			return new ModelAndView(jsonView_i, "data", returned);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar modificar elemento", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}
	
	@RequestMapping(value = "/estado", method = RequestMethod.GET)
	public ModelAndView addSolution(@RequestParam("idIncidente") int idIncidente, @RequestParam("estado") int estado) {
		try {
			int returned = this.incidentesDao.updateTicketState(idIncidente, estado);
			log.debug("Returing incidentes: " + returned);
			return new ModelAndView(jsonView_i, "data", returned);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar modificar elemento", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}
	
	@RequestMapping(value = "/actualizar", method = RequestMethod.GET)
	public ModelAndView updateTicket(@RequestParam("idIncidente") int idIncidente, @RequestParam("tecnico") int tecnico, @RequestParam("estado") int estado) {
		try {
			
			int returned = this.incidentesDao.updateTicket(idIncidente, tecnico, estado);
			log.debug("Returing incidentes: " + returned);
			return new ModelAndView(jsonView_i, "data", returned);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("Error al intentar modificar elemento", e);
			return createErrorResponse("Error Inesperado. Comuniquese con el administrador");
		}

	}

}
